# 管理员登录API 接口设计
from django.contrib.auth.decorators import permission_required
from django.utils.decorators import method_decorator
from rest_framework import status, mixins
from rest_framework.generics import CreateAPIView, GenericAPIView, ListAPIView
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.views import APIView
from meiduo_admin.serializers.users import AdminAuthSerializer, UserSerializer
from users.models import User


# 代码优化:登录API接口视图可以直接继承CreateAPIView
class AdminAuthorizeView(CreateAPIView):
    # 指定当前视图所使用的序列化器类
    serializer_class = AdminAuthSerializer
# class AdminAuthorizeView(APIView):
#     """管理员登录接口设计
#      请求方式： POST /meiduo_admin/authorizations/
#      请求参数： JSON 或 表单
#     """
#     def post(self, request):
#         """
#         管理员登录:
#         ① 获取参数并进行校验(参数完整性,用户名和密码是否正确)
#         ② 服务器生成jwt token数据
#         ③ 返回响应数据,登录成功
#         """
#         # 1.获取参数并进行校验
#         serializer = AdminAuthSerializer(data=request.data)
#         serializer.is_valid(raise_exception=True)
#
#         # 2.服务器生成JWT token数据
#         # 生成Jwt token 放到序列化器create方法中
#         # username = request.data.get('username')
#         # user = User.objects.get(username=username)
#         # from rest_framework_jwt.settings import api_settings
#         #
#         # jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
#         # jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
#         #
#         # payload = jwt_payload_handler(user)
#         # token = jwt_encode_handler(payload)
#
#         # 调用序列化器类中的create方法生成Jwt token数据
#         serializer.save()
#
#         # 3. 返回应答
#         # response_data = {
#         #     'id': user.id,
#         #     'username': user.username,
#         #     'token': token
#         # }
#         # return Response(response_data)
#         return Response(serializer.data, status=status.HTTP_201_CREATED)

class UserInfoView(ListAPIView):
    """
    用户管理--查询用户
    请求方式：GET /meiduo_admin/users/?keyword=<搜索内容>&page=<页码>&pagesize=<页容量>
    请求参数： 通过请求头传递jwt token数据
    参数	        类型	    是否必须	说明
    keyword	    str	    否	    搜索用户名
    page	    int	    否	    页码
    pagesize    int	    否	    页容量

    返回数据： JSON
    {
        "counts": "用户总量",
        "lists": [
            {
                "id": "用户id",
                "username": "用户名",
                "mobile": "手机号",
                "email": "邮箱"
            },
            ...
        ],
        "page": "页码",
        "pages": "总页数",
        "pagesize": "页容量"
    }
    """
    # 仅管理员才能进行访问
    permission_classes = [IsAdminUser]
    # 指定视图所使用的序列化器类
    serializer_class = UserSerializer

    def get_queryset(self):
        """重写父类中的get_queryset"""
        keyword = self.request.query_params.get('keyword')  # None

        if keyword:
            # 1.1 如果传递了keyword，查询用户名中含有keyword的普通用户的数据
            users = User.objects.filter(username__contains=keyword, is_staff=False)
        else:
            # 1.2 如果未传递keyword，查询所有的普通用户的数据
            users = User.objects.filter(is_staff=False)

        return users

    # permssion_required：指定接口访问权限，在接口被访问时，进行权限检查
    # Django中,提供了一个权限检查的装饰器permssion_required用来在API接口访问时,对用户的权限进行检查
    # 1.对应API接口的处理函数如果是函数视图，可以通过添加permssion_required装饰器来指定对应的权限检查
    # from django.contrib.auth.decorators import permission_required
    # @permission_required('<app_label>.<permission_codename>', raise_exception=True)
    # def my_view(request):
    #     pass

    # 2.对应API接口的处理函数如果是类视图，需要使用method_decorator将permission_required转换为针对类视图方法的装饰器
    @method_decorator(permission_required('users.view_user_api', raise_exception=True))
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)
